package mysql8学习.高级.第19章_数据库备份与恢复;

/**
 * 8 删库了不敢跑，能干点啥?
 * 传统的高可用架构是不能预防误删数据的，因为主库的一个drop table命令,
 * 会通过binlog传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。
 * 为了找到解决误删数据的更高效的方法，我们需要先对和MySQL相关的误删数据，
 * 做下分类:
 *      1.使用delete语句误删数据行;
 *      2.使用drop table或者truncate table语句误删数据表;
 *      3.使用drop database语句误删数据库;
 *      4.使用rm命令误删整个MySQL实例。
 *
 * 8.1 delete:误删行
 * 处理措施1:数据恢复
 *      使用Flashback工具恢复数据。
 *      原理:修改binlog内容,拿回原库重放。
 *      如果误删数据涉及到了多个事务的话，需要将事务的顺序调过来再执行。
 *      使用前提: binlog format=row和binlog_row_image=FULL
 * 处理措施2:预防
 *      ●代码上线前，必须SQL市查、审计。
 *      ●建议可以打开安全模式，把sql_safe_updates参数设置为on。
 *      强制要求加where条件且where后需要是索引字段，否则必须使用limit。否则就会报错。
 *
 * 8.2 truncate/drop:误删库/表
 * 背景:
 *     delete全表是很慢的，需要生成回滚日志、写redo、 写binlog。
 *     所以，从性能角度考虑，优先考虑使用truncate table或者drop table命令。
 *     使用delete命令删除的数据，你还可以用Flashback来恢复。
 *     而使用truncate /drop table和drop database命令删除的数据，就没办法通过Flashback来恢复了。
 *     因为，即使我们配置了binlog_format=row,执行这三个命令时，
 *     记录的binlog还是statement格式。binlog里面就只有一个truncate/drop 语句,这些信息是恢复不出数据的。
 *  方案:
 *      这种情况下恢复数据，需要使用全量备份与增量日志结合的方式。
 *      方案的前提:有定期的全量备份,并且实时备份binlog。
 *      举例:有人误删了一个库,时间为下午3点。步骤如下:
 *      1.取最近一次全量备份。假设设置数据库库是一天一备, 最近备份数据是当天凌晨2点;
 *      2.用备份恢复出一个临时库; (注意: 这里选择临时库，而不是直接操作主库)
 *      3.取出凌晨2点之后的binlog日志;
 *      4.剔除误删除数据的语句外,其它语句全部应用到临时库。(前面讲过 binlog 的恢复)
 *      5.最后恢复到主库
 *
 * 8.3预防使用 truncate/drop 误删库/表
 *   上面我们说了使用truncate /drop语句误删库/表的恢复方案，
 *   在生产环境中可以通过下面建议的方案来尽量的避免类似的误操作。
 *   (1)权限分离
 *      ● 限制帐户权限，核心的数据库,一般都不能随便分肥气权限,想要获取写权限需要审批。
 *        比如只给业务开发人员DML权限，不给truncate/drop权限。
 *        即使是DBA团队成员，日常也都规定只使用只读账号，必要的时候才使用有更新权限的账号。
 *      ● 不同的账号,不同的数据之间要进行权限分离，避免一个账号可以删除所有库。
 *   (2)制定操作规范
 *    比如在删除数据表之前，必须先对表做改名操作(比如加 _to_be_deleted)。
 *    然后，观察一段时间，确保对业务无影响以后再删除这张表。
 *   (3)设置延迟复制备库
 *    简单的说延迟复制就是设置一个固定的延迟时间，比如1个小时,让从库落后主库一个小时。
 *    出现误删除操作1小时内，到这个备库上执行stop slave,
 *    再通过之前介绍的方法，跳过误操作命令,就可以恢复出需要的数据。
 *    这里通过CHANGE MASTER TO MASTER_DELAY = N命令，可以指定这个备库持续保持跟主库有N秒的延迟。
 *    比如把N设置为3600，即代表1个小时。
 *    此外，延迟复制还可以用来解决以下问题:
 *      ① 用来做延迟测试，比如做好的数据库读写分离，把从库作为读库,
 *       那么想知道当数据产生延迟的时候到底会发生什么，就可以使用这个特性模拟延迟。
 *      ②用于老数据的查询等需求,
 *        比如你经常需要查看某天前一个表或者字段的数值，你可能需要把备份恢复后进行
 *        查看，如果有延迟从库，比如延迟一周， 那么就可以解决这样类似的需求。
 * 8.5 rm:误删MySQL实例
 *  对于一个有高可用机制的MySQL集群来说，不用担心rm删除数据。
 *  因为只删掉其中某一个节 点数据的话，HA系统就会选出一一个新的主库，
 *  从而保证整个集群的正常工作。
 *  我们把这个节点上的数据恢复回来后，再接入整个集群就好了。
 *  但如果是恶意地把整个集群删除，那就需要考虑跨机房备份，跨城市备份。
 *
 */
public class H_删库了不敢跑_能干点啥 {
}
